home *** CD-ROM | disk | FTP | other *** search
/ Atari Mega Archive 2 / Atari Mega Archive CD - Volume 2.iso / minix / up1510b.tgz / up1510b / src / commands / atari / astrip.c < prev    next >
C/C++ Source or Header  |  1990-07-15  |  3KB  |  190 lines

  1. /* @(#)astrip.c    1.4 */
  2. #define    ushort    unsigned short
  3.  
  4. #include "out.h"
  5. #include <signal.h>
  6. #include <stdio.h>
  7.  
  8. /*
  9.  
  10.     astrip -- remove symbols and relocation bits
  11.  
  12. */
  13.  
  14. char    *tname;
  15. char    *mktemp();
  16. FILE    *tf;
  17. struct outhead buf;
  18.  
  19. main(argc, argv)
  20. char **argv;
  21. {
  22.     int    status;
  23.  
  24.     signal(SIGHUP, SIG_IGN);
  25.     signal(SIGINT, SIG_IGN);
  26.     signal(SIGQUIT, SIG_IGN);
  27.     tname = mktemp("/tmp/sXXXXX");
  28.     while(--argc) {
  29.         if ((status = strip(argv[argc])) > 1)
  30.             break;
  31.     }
  32.     unlink(tname);
  33.     exit(status);
  34. }
  35.  
  36. strip(name)
  37. char *name;
  38. {
  39.     long size;
  40.     FILE *f;
  41.  
  42.     if ((f = fopen(name,"r")) == NULL) {
  43.         fprintf(stderr, "astrip: cannot open %s\n", name);
  44.         return(1);
  45.     }
  46.     getofmt ((char *)&buf, SF_HEAD , f);
  47.     if(BADMAGIC(buf)) {
  48.         fprintf(stderr, "astrip: %s-- bad format\n", name);
  49.         fclose(f);
  50.         return(1);
  51.     }
  52.     size = OFF_RELO(buf) - SZ_HEAD;
  53.     buf.oh_flags &= ~HF_LINK;
  54.     buf.oh_nrelo = 0;
  55.     buf.oh_nname = 0;
  56.     buf.oh_nchar = 0;
  57.  
  58.  
  59.     if ((tf = fopen(tname,"w")) == NULL) {
  60.         fprintf(stderr, "astrip: cannot create temp file %s\n", tname);
  61.         fclose(f);
  62.         return(2);
  63.     }
  64.     fseek(tf, (long)0, 0);
  65.     putofmt((char *)&buf,SF_HEAD,tf,tname);
  66.     if(copy(name, tname, f, tf, size)) {
  67.         fclose(f);
  68.         fclose(tf);
  69.         return(1);
  70.     }
  71.     fclose(f);
  72.     fclose(tf);
  73.     size += SZ_HEAD;
  74.     if ((f = fopen(name,"w")) == NULL) {
  75.         fprintf(stderr, "astrip: cannot write %s\n", name);
  76.         return(1);
  77.     }
  78.     if ((tf = fopen(tname,"r")) == NULL) {
  79.         fprintf(stderr, "astrip: cannot read temp file %s\n", tname);
  80.         fclose(f);
  81.         return(2);
  82.     }
  83.     fseek(tf, (long)0, 0);
  84.     if(copy(tname, name, tf, f, size)) {
  85.         fclose(f);
  86.         fclose(tf);
  87.         return(2);
  88.     }
  89.  
  90.     fclose(f);
  91.     fclose(tf);
  92.     return(0);
  93. }
  94.  
  95. copy(fnam, tnam, fr, to, size)
  96. char *fnam;
  97. char *tnam;
  98. long size;
  99. FILE *fr,*to;
  100. {
  101.     register s, n;
  102.     char lbuf[512];
  103.  
  104.     while(size != (long)0) {
  105.         s = 512;
  106.         if(size < 512)
  107.             s = (int) size;
  108.         n = fread(lbuf,1,s,fr);
  109.         if(n != s) {
  110.             fprintf(stderr, "astrip: unexpected eof on %s\n", fnam);
  111.             return(1);
  112.         }
  113.         n = fwrite(lbuf,1,s,to);
  114.         if(n != s) {
  115.             fprintf(stderr, "astrip: write error on %s\n", tnam);
  116.             return(1);
  117.         }
  118.         size -= (long)s;
  119.     }
  120.     return(0);
  121. }
  122.  
  123. getofmt(p, s, f)
  124. register char    *p;
  125. register char    *s;
  126. register FILE    *f;
  127. {
  128.     register i;
  129.     register long l;
  130.  
  131.     for (;;) {
  132.         switch (*s++) {
  133. /*        case '0': p++; continue; */
  134.         case '1':
  135.             *p++ = getc(f);
  136.             continue;
  137.         case '2':
  138.             i = getc(f);
  139.             i |= (getc(f) << 8);
  140.             *((short *)p) = i; p += sizeof(short);
  141.             continue;
  142.         case '4':
  143.             l = (long)getc(f);
  144.             l |= ((long)getc(f) << 8);
  145.             l |= ((long)getc(f) << 16);
  146.             l |= ((long)getc(f) << 24);
  147.             *((long *)p) = l; p += sizeof(long);
  148.             continue;
  149.         default:
  150.         case '\0':
  151.             break;
  152.         }
  153.         break;
  154.     }
  155. }
  156.  
  157. putofmt(p, s, f, fnam)
  158. register char    *p;
  159. register char    *s;
  160. register FILE    *f;
  161. char        *fnam;
  162. {
  163.     register i,j;
  164.     register long l;
  165.  
  166.     while (j = *s++) {
  167.         switch (j -= '0') {
  168. /*        case 0: p++; break; */
  169.         case 1:
  170.             i = *p++; putc(i,f);
  171.             break;
  172.         case 2:
  173.             i = *((short *)p); p += sizeof(short);
  174.             putc(i,f);
  175.             i>>=8; putc(i,f);
  176.             break;
  177.         case 4:
  178.             l = *((long *)p); p += sizeof(long);
  179.             putc((int)l,f);
  180.             l >>=8; putc((int)l,f);
  181.             l >>=8; putc((int)l,f);
  182.             l >>=8; putc((int)l,f);
  183.             break;
  184.         default:
  185.             break;
  186.         }
  187.         if (ferror(f)) fprintf(stderr, "astrip: write error on %s\n", fnam);
  188.     }
  189. }
  190.